// Stream 有四种流类型：
// Readable - 可读操作。
// Writable - 可写操作。
// Duplex - 可读可写操作.
// 所有的 Stream 对象都是 EventEmitter 的实例。 常用的事件有：
// data - 当有数据可读时触发。
// end - 没有更多的数据可读时触发。
// error - 在接收和写入过程中发生错误时触发。
// finish - 所有数据已被写入到底层系统时触发。



var fs = require('fs');
var data = "";

var data1 = "我是待写入数据";

var readstream = fs.createReadStream("cs.txt"); // 可读取
// var writerStream = fs.createWriteStream('cs.txt'); //可写
var writerStreams = fs.createWriteStream('newkexr.txt'); //可写

readstream.setEncoding('UTF8');
// writerStreams.setEncoding('UTF8');
// readstream.on('data', function(chunk) {
// console.log(chunk); //读取文件的值
// data += chunk;
var data2 = data1;
// writerStream.end();
// console.log(data2);
// 使用 utf8 编码写入数据
writerStreams.write(data2, 'UTF8'); //注意会覆盖当前文件的内容，在读取后赋值给变量存储再重新存储
// })



// readstream.on('end', function() {
//   // var data2 = data + data1;
//   // console.log(data2);
//   // // 使用 utf8 编码写入数据
//   // writerStream.write(data2, 'UTF8'); //注意会覆盖当前文件的内容，在读取后赋值给变量存储再重新存储
// });

// readstream.on('error', function(err) {
//   console.log(err);
//   // data += chunk;
// })



// 管道流
// 管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

readstream.pipe(writerStreams); //通过pipe（管道）来把redstream写入到cs.txt文档里面[追加]

// 文件压缩 引入 zlib模块
var zlib = require("zlib");
// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('cs.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));

console.log("文件压缩完成。");
